#!/bin/bash

# 一键安装脚本 - 自动部署 Node-RED 和 FRP 服务
# 包含自动端口递增功能，避免多机器部署时的端口冲突

set -e  # 遇到错误时退出

# 配置变量
REPO_URL="https://gitee.com/Francesc/noderedinstall.git"
PROJECT_DIR="noderedinstall"
BRANCH="master"

# 错误处理
error_exit() {
    echo -e "\033[0;31m[ERROR]\033[0m 安装过程中发生错误: $1" >&2
    echo -e "\033[0;31m[ERROR]\033[0m 正在清理..." >&2
    cleanup
    exit 1
}

# 设置错误处理陷阱
trap 'error_exit "脚本在第 $LINENO 行异常退出"' ERR

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_step() {
    echo -e "${PURPLE}[STEP]${NC} $1"
}

print_banner() {
    echo -e "${CYAN}"
    echo "=================================================="
    echo "🚀 Node-RED & FRP 一键部署脚本"
    echo "功能: 自动克隆、配置递增、安装服务"
    echo "=================================================="
    echo -e "${NC}"
}

# 检查系统要求
check_requirements() {
    print_step "检查系统要求..."
    
    # 检查是否为 root 用户
    if [ "$EUID" -ne 0 ]; then
        print_error "请使用 root 用户运行此脚本"
        echo "正确用法: sudo $0"
        exit 1
    fi
    
    # 检查必要工具
    local missing_tools=()
    
    if ! command -v git >/dev/null 2>&1; then
        missing_tools+=("git")
    fi
    
    if ! command -v curl >/dev/null 2>&1; then
        missing_tools+=("curl")
    fi
    
    if ! command -v python3 >/dev/null 2>&1; then
        missing_tools+=("python3")
    fi
    
    if [ ${#missing_tools[@]} -gt 0 ]; then
        print_warning "缺少必要工具，正在安装: ${missing_tools[*]}"
        
        # 检测包管理器并安装
        if command -v apt-get >/dev/null 2>&1; then
            apt-get update
            apt-get install -y ${missing_tools[*]}
        elif command -v yum >/dev/null 2>&1; then
            yum install -y ${missing_tools[*]}
        elif command -v dnf >/dev/null 2>&1; then
            dnf install -y ${missing_tools[*]}
        else
            print_error "无法识别包管理器，请手动安装: ${missing_tools[*]}"
            exit 1
        fi
    fi
    
    print_success "系统要求检查完成"
}

# 克隆或更新项目
setup_project() {
    print_step "设置项目环境..."
    
    # 配置Git用户信息（用于自动推送）
    print_info "配置Git用户信息和凭据..."
    git config --global user.email "yang369875@126.com" 2>/dev/null || true
    git config --global user.name "yangyang" 2>/dev/null || true
    
    # 配置凭据存储（首次推送后自动保存）
    if command -v git-credential-store >/dev/null 2>&1; then
        git config --global credential.helper store 2>/dev/null || true
        print_info "已启用Git凭据存储，首次推送后将自动保存密码"
    elif command -v git-credential-cache >/dev/null 2>&1; then
        git config --global credential.helper 'cache --timeout=3600' 2>/dev/null || true
        print_info "已启用Git凭据缓存（1小时）"
    fi
    
    if [ -d "$PROJECT_DIR" ]; then
        print_info "项目目录已存在，正在更新..."
        cd "$PROJECT_DIR"
        
        # 检查是否为 Git 仓库
        if [ -d ".git" ]; then
            git fetch origin
            git reset --hard origin/$BRANCH
            print_success "项目已更新到最新版本"
        else
            print_warning "目录存在但不是 Git 仓库，将重新克隆"
            cd ..
            rm -rf "$PROJECT_DIR"
            git clone "$REPO_URL" "$PROJECT_DIR"
            cd "$PROJECT_DIR"
        fi
    else
        print_info "克隆项目仓库..."
        git clone "$REPO_URL" "$PROJECT_DIR"
        cd "$PROJECT_DIR"
        print_success "项目克隆完成"
    fi
    
    # 确保脚本可执行
    chmod +x *.sh 2>/dev/null || true
}

# 自动配置端口递增
auto_increment_config() {
    print_step "端口递增配置..."
    
    if [ ! -f "auto_increment_and_push.sh" ]; then
        print_error "未找到自动递增脚本"
        exit 1
    fi
    
    # 先预览将要进行的更改
    print_info "预览配置更改..."
    ./auto_increment_and_push.sh -d
    
    echo ""
    print_warning "⚠️  重要提醒：每台新机器都应该进行端口递增以避免冲突！"
    echo ""
    
    # 使用用户选择界面
    if [ -f "prompt_increment.sh" ]; then
        chmod +x prompt_increment.sh
        if ./prompt_increment.sh; then
            print_success "✅ 用户选择处理完成"
            return 0
        else
            print_error "❌ 用户选择处理失败"
            exit 1
        fi
    else
        print_error "未找到用户选择脚本 prompt_increment.sh"
        exit 1
    fi
}

# 安装 Node-RED
install_nodered() {
    print_step "安装 Node-RED 服务..."
    
    if [ ! -f "install_nodered.sh" ]; then
        print_error "未找到 Node-RED 安装脚本"
        exit 1
    fi
    
    print_info "开始安装 Node-RED..."
    ./install_nodered.sh
    
    # 验证安装
    if systemctl is-active --quiet nodered; then
        print_success "Node-RED 服务安装成功并正在运行"
    else
        print_warning "Node-RED 服务可能未正常启动，请检查状态"
    fi
}

# 安装 FRP 客户端
install_frp() {
    print_step "安装 FRP 客户端服务..."
    
    if [ ! -f "install_frp.sh" ]; then
        print_error "未找到 FRP 安装脚本"
        exit 1
    fi
    
    print_info "开始安装 FRP 客户端..."
    ./install_frp.sh
    
    # 验证安装
    if systemctl is-active --quiet frpc; then
        print_success "FRP 客户端服务安装成功并正在运行"
    else
        print_warning "FRP 客户端服务可能未正常启动，请检查状态"
    fi
}

# 显示安装结果
show_installation_result() {
    local frpc_config="frpc/frpc.ini"
    
    echo ""
    print_success "🎉 安装完成！"
    echo ""
    
    # 显示递增状态
    if [ "$INCREMENT_PERFORMED" = "true" ]; then
        print_success "✅ 端口配置已递增并同步到Git"
    elif [ "$INCREMENT_PERFORMED" = "false" ]; then
        print_warning "⚠️  跳过了端口递增（可能存在端口冲突风险）"
    fi
    echo ""
    
    if [ -f "$frpc_config" ]; then
        # 解析配置信息
        local ssh_port=$(grep 'remote_port' "$frpc_config" | head -1 | grep -o '[0-9]\+')
        local domain=$(grep 'custom_domains.*nodered' "$frpc_config" | head -1 | grep -o 'nodered[0-9]\+' | head -1)
        local server_addr=$(grep 'server_addr' "$frpc_config" | head -1 | cut -d'=' -f2 | tr -d ' ')
        
        echo -e "${CYAN}=== 连接信息 ===${NC}"
        echo "🌐 SSH 连接: ssh -p $ssh_port user@$server_addr"
        echo "🔗 Node-RED 访问: http://${domain}.esunfly.com"
        echo "🏠 本地 Node-RED: http://$(hostname -I | awk '{print $1}'):1880"
        echo ""
    fi
    
    echo -e "${CYAN}=== 服务状态 ===${NC}"
    echo "📊 Node-RED 状态:"
    systemctl status nodered --no-pager -l || true
    echo ""
    echo "🔗 FRP 客户端状态:"
    systemctl status frpc --no-pager -l || true
    echo ""
    
    echo -e "${CYAN}=== 常用命令 ===${NC}"
    echo "查看 Node-RED 日志: journalctl -u nodered -f"
    echo "查看 FRP 日志: journalctl -u frpc -f"
    echo "重启 Node-RED: sudo systemctl restart nodered"
    echo "重启 FRP: sudo systemctl restart frpc"
    echo ""
    
    echo -e "${GREEN}部署完成！现在您可以开始使用服务了。${NC}"
}

# 显示帮助信息
show_help() {
    echo "Node-RED & FRP 一键安装脚本"
    echo ""
    echo "用法: sudo $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help              显示帮助信息"
    echo "  --skip-increment        跳过自动端口递增"
    echo "  --only-nodered          仅安装 Node-RED"
    echo "  --only-frp              仅安装 FRP"
    echo "  --repo URL              指定仓库地址"
    echo "  --branch BRANCH         指定分支名称"
    echo ""
    echo "示例:"
    echo "  sudo $0                 # 完整安装"
    echo "  sudo $0 --skip-increment # 跳过端口递增"
    echo "  sudo $0 --only-nodered  # 仅安装 Node-RED"
    echo ""
}

# 清理函数
cleanup() {
    local exit_code=$?
    if [ $exit_code -ne 0 ]; then
        echo -e "\033[0;31m[ERROR]\033[0m 安装过程中发生错误（退出码: $exit_code）"
        echo -e "\033[0;33m[CLEANUP]\033[0m 清理临时文件..."
        
        # 清理可能的临时文件
        if [ -d "$PROJECT_DIR" ] && [ "$PROJECT_DIR" != "." ]; then
            echo -e "\033[0;33m[CLEANUP]\033[0m 清理项目目录: $PROJECT_DIR"
            # 注意：这里不删除目录，因为用户可能需要查看日志
        fi
        
        echo -e "\033[0;33m[INFO]\033[0m 如需帮助，请查看项目文档或联系管理员"
    fi
}

# 解析命令行参数
SKIP_INCREMENT=false
ONLY_NODERED=false
ONLY_FRP=false

while [[ $# -gt 0 ]]; do
    case $1 in
        -h|--help)
            show_help
            exit 0
            ;;
        --skip-increment)
            SKIP_INCREMENT=true
            shift
            ;;
        --only-nodered)
            ONLY_NODERED=true
            shift
            ;;
        --only-frp)
            ONLY_FRP=true
            shift
            ;;
        --repo)
            REPO_URL="$2"
            shift 2
            ;;
        --branch)
            BRANCH="$2"
            shift 2
            ;;
        *)
            print_error "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
done

# 设置清理陷阱
trap cleanup EXIT

# 主程序执行
main() {
    print_banner
    
    # 检查系统要求
    check_requirements
    
    # 设置项目环境
    setup_project
    
    # 端口递增（除非跳过）
    if [ "$SKIP_INCREMENT" = false ] && [ "$ONLY_NODERED" = false ]; then
        auto_increment_config
    fi
    
    # 根据选项安装服务
    if [ "$ONLY_FRP" = true ]; then
        install_frp
    elif [ "$ONLY_NODERED" = true ]; then
        install_nodered
    else
        # 完整安装
        install_nodered
        install_frp
    fi
    
    # 显示安装结果
    show_installation_result
}

# 运行主程序
main
